package com.sss.hloster07;

import java.io.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class TestDOM {

	public static void main(String[] args) {
		test01();
	}

	/**
	 * DOM解析XML
	 */
	private static void test01() {
		try {
			// 创建解析工厂
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			// 通过解析工厂获得DOM解析器
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 解析指定XML文件，得到DOM节点树
			// 本例中的vehicles.xml文件与src目录处于同一级目录中
			Document doc = db.parse("src/Vehicles02.xml");
			// 得到根节点
			Node vehicles = doc.getChildNodes().item(0);
			// 获取根节点的所有子节点
			NodeList vChildNodes = vehicles.getChildNodes();
			// 统计根节点的所有子节点个数
			int count = 0;
			for (int i = 0; i < vChildNodes.getLength(); i++) {
				if (vChildNodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
					count++;
				}
			}
			System.out.println("“租车系统”中共有  " + count + "  种类型的车！");
			// 得到所有的<truck>节点列表信息
			NodeList truckList = doc.getElementsByTagName("truck");
			System.out.println("“租车系统”中共有  " + truckList.getLength() + "  辆卡车！");
			// 遍历所有卡车
			for (int i = 0; i < truckList.getLength(); i++) {
				// 获取索引为i 的卡车
				Node truck = truckList.item(i);
				// 获取卡车属性值并显示
				Element element = (Element) truck;
				String idValue = element.getAttribute("id");
				// 以下通过属性名称属性节点，再通过getNodeValue()获得属性值
				// Node attr =element.getAttributeNode("id");
				// String idValue=attr.getNodeName();
				System.out.println("id为  " + idValue + " 卡车的信息为：");
				// 获取索引为 i的卡车详细信息并输出
				for (Node node = truck.getFirstChild(); node != null; node = node.getNextSibling()) {
					// 根据节点类型进行判断，显示元素节点信息，如<oil>20</oil>
					if (node.getNodeType() == Node.ELEMENT_NODE) {
						// 元素节点的节点名为标签名，如oil
						String name = node.getNodeName();
						// 元素节点<oil>20</oil>下第一个子节点为文本节点20，得到节点值为20
						String value = node.getFirstChild().getNodeValue();
						System.out.println("     " + name + "  :    " + value + "  :     ");
					}
				}
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();

		} catch (IOException e) {

			e.printStackTrace();
		}

	}
}
